﻿/*
SINACOR - BMF&Bovespa
Arquivo: MensagemErroRecebida.cs
Criado em: 27-mai-2010 14:09:37
Arquiteto Responsável: p-dmartinelli
*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Servico.Bovespa.Alocacao.ResourceAccess 
{
	public class MensagemErroRecebida : BaseResourceAccess 
	{
		#region Construtor

		public MensagemErroRecebida()
			: base(AuthorizationContext.Current.CompanyId)
		{
		}

		#endregion

		#region Métodos

        #region ConsultarMensagemErroRecebida

        /// <summary>
		/// Pesquisa de Inconsistências de Mensagens Recebidas
		/// </summary>
        /// <param name="filtro">Parâmetro para pesquisar inconsistências de mensagens recebidas</param>
        public List<BusinessEntity.MensagemErroRecebida> ConsultarMensagemErroRecebida(BusinessEntity.Parameter.FiltroMensagemErroRecebida filtro)
		{
            List<BusinessEntity.MensagemErroRecebida> retorno = null;
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("SELECT");
            sql.AppendLine("    DT_DATREF DataReferencia,");
            sql.AppendLine("    NR_CTRL NumeroMensagem,");
            sql.AppendLine("    CD_MSG Codigo,");
            sql.AppendLine("    DS_ERRO Descricao,");
            sql.AppendLine("    DESC_ERRO_CHAV_RECU DescricaoResouceKey,");
            sql.AppendLine("    TXT_ARGU_ERRO DescricaoArgs");
            sql.AppendLine("FROM");
            sql.AppendLine("    TORERRO_MSG_RECB");
            sql.AppendLine("WHERE");
            sql.AppendLine("    dt_datref >= (SELECT MAX(DT_MOV)");
            sql.AppendLine("                    FROM TBOCALE)");            

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                if (!filtro.ExibirAvisosNaoTrataveis)
                {
                    sql.AppendLine("AND ID_REPROC > 0");
                }

                sql.AppendLine("ORDER BY DT_DATMOV, NR_CTRL, CD_MSG");

                command.CommandText = sql.ToString();

                retorno = this.FindAll<BusinessEntity.MensagemErroRecebida>(command, reader => new BusinessEntity.MensagemErroRecebida
                {
                    Codigo = reader.GetValue<string>("Codigo"),
                    DataReferencia = reader.GetValue<DateTime>("DataReferencia"),
                    Descricao = reader.GetValue<string>("Descricao"),

                    DescricaoArgs = (reader["DescricaoArgs"]!=null && reader["DescricaoArgs"]!=DBNull.Value) 
                                                         ? ErrorMessage.ConvertXmlArgumentsToParameters(reader.GetValue<string>("DescricaoArgs"))
                                                         : null,

                    DescricaoResourceKey = reader.GetValue<string>("DescricaoResouceKey"),
                    NumeroMensagem = reader.GetValue<string>("NumeroMensagem")
                });
            }		

            return retorno;
        }

        #endregion

        #region ExisteMensagemEtf

        /// <summary>
		/// Verifica se existem mensagens de erro de negócios ETF - msg CBL0610/CBL0611
		/// </summary>
        /// <returns></returns>
		public bool ExisteMensagemEtf()
		{
            bool isExisteMensagemEtf = false;
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("SELECT");
            sql.AppendLine("    COUNT(CD_MSG) Existe");
            sql.AppendLine("FROM");
            sql.AppendLine("    TORERRO_MSG_RECB");
            sql.AppendLine("WHERE");
            sql.AppendLine("    DT_DATREF >= (SELECT MAX(DT_MOV)");
            sql.AppendLine("                    FROM TBOCALE)");
            sql.AppendLine("AND (CD_MSG = 'CBL0610' OR CD_MSG = 'CBL0611')");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                if (Convert.ToInt32(this.DataBase.ExecuteScalar(command)) > 0)
                {
                    isExisteMensagemEtf = true;
                }
            }

            return isExisteMensagemEtf;
        }

        #endregion

        #region ExisteMensagemRecompra

        /// <summary>
		/// Verifica se existem mensagens de erro de negócios de Recompra - msg CBL0690
		/// </summary>
		public bool ExisteMensagemRecompra()
		{
            bool isExisteMensagemRecompra = false;
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("SELECT");
            sql.AppendLine("    COUNT(CD_MSG) Existe");
            sql.AppendLine("FROM");
            sql.AppendLine("    TORERRO_MSG_RECB");
            sql.AppendLine("WHERE");
            sql.AppendLine("    DT_DATREF >= (SELECT MAX(DT_MOV)");
            sql.AppendLine("                    FROM TBOCALE)");
            sql.AppendLine("AND CD_MSG = 'CBL0690'");
            sql.AppendLine("");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                if (Convert.ToInt32(this.DataBase.ExecuteScalar(command)) > 0)
                {
                    isExisteMensagemRecompra = true;
                }
            }

            return isExisteMensagemRecompra;
        }

        #endregion

        #region ProcessarAcertoMensagemEtf

        /// <summary>
		/// Acerta as mensagens de erro de negócios ETF - msg CBL0610/CBL0611
		/// </summary>
		/// <param name="dataMovimento">Data do Movimento</param>
		public void ProcessarAcertoMensagemEtf(DateTime dataMovimento)
		{
            StringBuilder sql = new StringBuilder();        

            using (DbCommand dbCommand = this.DataBase.GetStoredProcCommand("pOr_ETF.pOr_Trata_Pend"))
            {
                this.DataBase.AddInParameter(dbCommand, "P_sDtDatmov", DbType.String, this.FormatarData(dataMovimento));

                this.DataBase.ExecuteNonQuery(dbCommand);
            }
        }

        #endregion

        #region ProcessarAcertoMensagemRecompra

        /// <summary>
		/// Acerta as mensagens de erro de negócios de Recompra - msg CBL0690
		/// </summary>
        /// <param name="dataMovimento">Data do Movimento</param>
		public void ProcessarAcertoMensagemRecompra(DateTime dataMovimento)
		{
            StringBuilder sql = new StringBuilder();
            
            using (DbCommand dbCommand = this.DataBase.GetStoredProcCommand("pOr_Trata_RCPA.pOr_Trata_Pend"))
            {
                this.DataBase.AddInParameter(dbCommand, "P_sDtDatmov", DbType.String, this.FormatarData(dataMovimento));

                this.DataBase.ExecuteNonQuery(dbCommand);
            }
		}

		#endregion

        #endregion

        #region Métodos Privados

        private string FormatarData(DateTime data)
        {
            return data.Day.ToString().PadLeft(2, '0') + '-' +
                   data.Month.ToString().PadLeft(2, '0') + '-' +
                   data.Year.ToString();
        }

        #endregion
    }
}